package com.treepoke.util.number;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * Clase que realiza tareas de conversion entre números
 */
public class NumberUtil {

    public final static String PATRON_NUMBER_1 = "###,###,###,##0.00";
    public final static String PATRON_NUMBER_2 = "0";
    public final static String PATRON_NUMBER_3 = "#.##%";
    private static DecimalFormat decimalConverter = new DecimalFormat(PATRON_NUMBER_1);
    private static DecimalFormat integerConverter = new DecimalFormat(PATRON_NUMBER_2);
    private static DecimalFormat percentageConverter = new DecimalFormat(PATRON_NUMBER_3);

    /**
     * Obtiene el formato decimal de un número.
     *
     * @param numberToConvert
     * @return
     */
    public static String getDecimalFormatFromNumber(BigDecimal numberToConvert) {
        return decimalConverter.format(numberToConvert.doubleValue());
    }

    /**
     * Obtiene el formato entero de un número.
     *
     * @param numberToConvert
     * @return
     */
    public static String getIntegerFormatFromNumber(BigDecimal numberToConvert) {
        return integerConverter.format(numberToConvert.doubleValue());
    }

    /**
     * Obtiene el formato porcentual de un número.
     *
     * @param numberToConvert
     * @return
     */
    public static String getPercentageFormatFromNumber(BigDecimal numberToConvert) {
        return percentageConverter.format(numberToConvert.doubleValue());
    }

    /**
     * Devuelve una cadena de texto que representa el número y el patrón
     * enviados como parámetro
     *
     * @param numberToConvert
     * @param pattern
     * @return
     */
    public static String getStringFromNumber(BigDecimal numberToConvert, String pattern) {
        return (new DecimalFormat(pattern)).format(numberToConvert);
    }

    /**
     * Devuelve un número redondeado a los decimales que desee
     *
     * @param number numero a redondear
     * @param scale decimales
     * @param roundingMode: Modo de redondeo, ejemplo RoundingMode.UP
     * @return
     */
    public static BigDecimal getRedondearNumber(BigDecimal number, int scale, RoundingMode roundingMode) {
        return number.setScale(scale, roundingMode);
    }

    /**
     * Convierte un String en BigDecimal
     *
     * @param numberToConvert
     * @return
     */
    public static BigDecimal convertStringBigDecimal(String numberToConvert) {
        numberToConvert = numberToConvert.replace(",", ".");
        return new BigDecimal(numberToConvert);
    }
}
